LOADER_BASE_ADDR equ 0x900 ; 加载器被加载到0x900处
LOADER_START_SECTOR equ 0x2 ; 加载器被储存在0x2扇区上
PAGE_DIR_TABLE_POS equ 0x100000
KERNEL_START_SECTOR equ 0x9 ; 内核被储存在硬盘的0x9扇区上
KERNEL_BIN_BASE_ADDR equ 0x70000 ; 内核被加载到内存的0x70000处
KERNEL_ENTRY_POINT equ 0xc0001500 ; 内核执行入口地址

;------------ gdt 描述符属性, 字段宏 -----------
DESC_G_4K          equ  1000_0000_0000_0000_0000_0000b ; 23位的颗粒度G设置为1, 段限长单位为4KB
DESC_D_32          equ   100_0000_0000_0000_0000_0000b ; 22位的默认操作数大小D标识为1，表示默认32位操作数
DESC_L             equ    00_0000_0000_0000_0000_0000b ; 21位为0表示32位代码段
DESC_AVL           equ     0_0000_0000_0000_0000_0000b ; 20位AVL系统软件或其他软件可用位标识, 自定义位，
                                                       ; 对硬件来说无意义

DESC_LIMIT_CODE2   equ       1111_0000_0000_0000_0000b ; 16-19位，4 bit第二部分限段长; 代码段的段描述符
DESC_LIMIT_DATA2   equ       DESC_LIMIT_CODE2 ; 数据段的段描述符
; 内存A0000-C7FFF为显存的映射，本项目中使用文本显示映射部分B8000-BFFFF 32K内存, 段限长高4位为0
DESC_LIMIT_VIDEO2  equ       0000_0000_0000_0000_0000b ; 显存段的段限长高位

DESC_P             equ            1000_0000_0000_0000b ; 15位，段存在标识，1表示在内存中，0为不在内存中

DESC_DPL_0         equ             000_0000_0000_0000b ; 13-14位，DPL特权级，0为最高，3为最低
DESC_DPL_1         equ             010_0000_0000_0000b
DESC_DPL_2         equ             100_0000_0000_0000b
DESC_DPL_3         equ             110_0000_0000_0000b

DESC_S_CODE        equ               1_0000_0000_0000b ; 12位，段描述符类型标识，0表示系统段描述符，1表示代码或数据段描述符
DESC_S_DATA        equ               DESC_S_CODE
DESC_S_SYS         equ               0_0000_0000_0000b

; 8-11位，4bit段类型字段，依据S标识，表示系统段或代码数据段的不同类型
; 代码段4bit, 高11位->低8位, x:可执行, c:一致性, r:可读, a:已访问
DESC_TYPE_CODE     equ                 1000_0000_0000b ; 可执行，非一致性，不可读，未访问的代码段

; 数据段4bit, 高11位->低8位, x:可执行, e:拓展方向[区分栈和堆, 堆栈必须可读写], w:可写, a:已访问 
DESC_TYPE_DATA     equ                 0010_0000_0000b ; 不可执行，向上扩展，可写，未访问的数据段
                                                       ; 在这里虽然是向上拓展, 但是也把定为栈, 详细见书p163

; 定义代码段高32位段描述符
DESC_CODE_HIGH     equ    (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + \
                           DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_CODE + \
                           DESC_TYPE_CODE + 0x00

; 定义数据段高32位段描述符
DESC_DATA_HIGH     equ    (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + \
                           DESC_LIMIT_DATA2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + \
                           DESC_TYPE_DATA + 0x00

; 定义显存段高32位段描述符, 显存段基址为0xb8000, 所以高32位中0-7位段基址为0x0b
DESC_VIDEO_HIGH     equ    (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + \
                           DESC_LIMIT_VIDEO2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + \
                           DESC_TYPE_DATA + 0x0b

;------------ 选择子宏 -----------
; RPL 请求特权级
RPL0 equ 00b
RPL1 equ 01b
RPL2 equ 10b
RPL3 equ 11b
; TI 从GDT还是LDT表中寻找
TI_GDT equ 000b 
TI_LDT equ 100b 

; ------------- 页表相关属性 -------
PG_P     equ   1b
PG_RW_R  equ  00b
PG_RW_W  equ  10b
PG_US_S  equ 000b
PG_US_U  equ 100b

; ----------- ELF相关属性值
PT_NULL equ 0 ; 程序头结构中p_type值, 为空
PT_LOAD equ 1 ; 程序头结构中p_type值为LOAD
